﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;

namespace Controllers
{
    public class ClienteController
    {
        public static List<Cliente> ObtenerClientesTop5(string date_from, string date_to)
        {
            var list = new List<Cliente>();

            var sql = "SELECT top 5 Cliente_Nombre, Cliente_Apellido, Cliente_Dni, sum(Viaje_Importe) [Recaudacion] " +
                        "FROM Superacidos.Viaje " +
                        "JOIN Superacidos.Cliente on Cliente_Id = Viaje_ClienteId " +
                        "WHERE Viaje_fecha between '" + date_from + "' and '" + date_to + "' " +
                        "Group By Viaje_ClienteId, Cliente_Nombre, Cliente_Apellido, Cliente_Dni, Viaje_Importe " +
                        "Order BY Recaudacion DESC";
          
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);
            
            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    list.Add(ObtenerObjetoEstadistico(reader));
                }
            }

            return list;
        }

        public static List<Cliente> ObtenerTodos(string where, int pagina,int cantidadRegistros)
        {
            var list = new List<Cliente>();

            var sql = "Select TOP " + cantidadRegistros + " * From Superacidos.Cliente";
            
            if (pagina > 1)
            {
                int limiteAnterior = (pagina - 1) * cantidadRegistros;

                var filtrospaginador = !string.IsNullOrEmpty(where)
                                       ? " Cliente_Id NOT IN " + "(Select TOP " + limiteAnterior +
                                         " Cliente_Id from Superacidos.Cliente WHERE " + where +
                                         " ORDER BY Cliente_Id) "
                                       : " Cliente_Id NOT IN " + "(Select TOP " + limiteAnterior +
                                         " Cliente_Id from Superacidos.Cliente ORDER BY Cliente_Id) ";

                if (!string.IsNullOrEmpty(where))
                {
                    where += " AND ";
                }
                where += filtrospaginador;
            }
            
            
            if (!string.IsNullOrEmpty(where))
            {
                sql += " WHERE " + where;
            }

            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    list.Add(ObtenerObjeto(reader));
                }
            }

            return list;
        }

        public static List<Cliente> ObtenerTodos(string where)
        {
            var list = new List<Cliente>();
            var sql = "Select * From Superacidos.Cliente";

            if (!string.IsNullOrEmpty(where))
            {
                sql += " WHERE " + where;
            }

            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    list.Add(ObtenerObjeto(reader));
                }
            }

            return list;
        }

        public  static bool ExisteElTelefono(string telefono,int clienteId)
        {

            var sql = "Select count(*) as Cantidad From Superacidos.Cliente WHERE Cliente_Telefono = " + telefono;
            if (clienteId > 0)
            {
                sql += " AND Cliente_Id <> " + clienteId;
            }

            var cantidad = 0;
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                reader.Read();
                if (reader["Cantidad"] != DBNull.Value)
                    cantidad = (int)reader["Cantidad"];

            }

            return cantidad > 0;
        }
         
        public static int ObtenerCantidad(string where)
        {
            var sql = "Select count(*) as Cantidad From Superacidos.Cliente";

            if (!string.IsNullOrEmpty(where))
            {
                sql += " WHERE " + where;
            }
            var cantidad = 0;
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                reader.Read();
                if (reader["Cantidad"] != DBNull.Value)
                    cantidad = (int)reader["Cantidad"];

            }

            return cantidad;
        }

        public static List<Cliente> ObtenerTodosHabilitados(string where)
        {
            if (!string.IsNullOrEmpty(where))
            {
                where += " AND ";
            }
            where += " Cliente_Habilitado = 1";

            return ObtenerTodos(where);
        }

        public static Cliente ObtenerUno(int clienteId)
        {
            var reader = ConexionBaseDeDatos.GetData("Select * From Superacidos.Cliente Where Cliente_Id = " + clienteId, CommandType.Text);

            return reader.HasRows ? ObtenerObjeto(reader) : null;
        }

        public static Cliente ObtenerObjeto(OleDbDataReader reader)
        {
            var cliente = new Cliente();

            if (reader["Cliente_Apellido"] != DBNull.Value)
                cliente.Cliente_Apellido = (string)reader["Cliente_Apellido"];
            if (reader["Cliente_Codigo_Postal"] != DBNull.Value)
                cliente.Cliente_Codigo_Postal = (int)reader["Cliente_Codigo_Postal"];
            if (reader["Cliente_Direccion"] != DBNull.Value)
                cliente.Cliente_Direccion = (string)reader["Cliente_Direccion"];
            if (reader["Cliente_Dni"] != DBNull.Value)
                cliente.Cliente_Dni = (decimal)reader["Cliente_Dni"];
            if (reader["Cliente_Fecha_Nac"] != DBNull.Value)
                cliente.Cliente_Fecha_Nac = (DateTime)reader["Cliente_Fecha_Nac"];
            if (reader["Cliente_Habilitado"] != DBNull.Value)
                cliente.Cliente_Habilitado = (bool)reader["Cliente_Habilitado"];
            if (reader["Cliente_Id"] != DBNull.Value)
                cliente.Cliente_Id = (int)reader["Cliente_Id"];
            if (reader["Cliente_Mail"] != DBNull.Value)
                cliente.Cliente_Mail = (string)reader["Cliente_Mail"];
            if (reader["Cliente_Nombre"] != DBNull.Value)
                cliente.Cliente_Nombre = (string)reader["Cliente_Nombre"];
            if (reader["Cliente_Telefono"] != DBNull.Value)
                cliente.Cliente_Telefono = (decimal)reader["Cliente_Telefono"];
            
            return cliente;
        }

        public static Cliente ObtenerObjetoEstadistico(OleDbDataReader reader)
        {
            var cliente = new Cliente();

            if (reader["Cliente_Apellido"] != DBNull.Value)
                cliente.Cliente_Apellido = (string)reader["Cliente_Apellido"];
            if (reader["Cliente_Dni"] != DBNull.Value)
                cliente.Cliente_Dni = (decimal)reader["Cliente_Dni"];
            if (reader["Cliente_Nombre"] != DBNull.Value)
                cliente.Cliente_Nombre = (string)reader["Cliente_Nombre"];
            if (reader["Recaudacion"] != DBNull.Value)
                cliente.Cliente_Consumo = (decimal)reader["Recaudacion"];

            return cliente;
        }

        public static void Agregar(Cliente cliente)
        {
            var sql = "INSERT INTO SUPERACIDOS.Cliente (Cliente_Nombre, Cliente_Apellido, Cliente_Dni, Cliente_Telefono, Cliente_Direccion," +
                      " Cliente_Mail, Cliente_Fecha_Nac,Cliente_Codigo_Postal, Cliente_Habilitado) " +
                      " VALUES ('{0}','{1}',{2},{3},'{4}',{5},'{6}',{7},{8})";

            sql = string.Format(sql, cliente.Cliente_Nombre, cliente.Cliente_Apellido, cliente.Cliente_Dni, cliente.Cliente_Telefono,
                                     cliente.Cliente_Direccion,
                                     string.IsNullOrEmpty(cliente.Cliente_Mail) ? null : "'" + cliente.Cliente_Mail + "'",
                                     cliente.Cliente_Fecha_Nac.ToString("yyyy-MM-dd"), cliente.Cliente_Codigo_Postal,
                                     cliente.Cliente_Habilitado ? "1" : "0");


            ConexionBaseDeDatos.Guardar(sql, CommandType.Text);

        }

        public static void Modificar(Cliente cliente)
        {
            var sql = "update SUPERACIDOS.Cliente set Cliente_Nombre = '{0}' , Cliente_Apellido = '{1}', Cliente_Dni = {2}, Cliente_Telefono = {3}, " +
                      "Cliente_Direccion = '{4}', Cliente_Mail = {5}, Cliente_Fecha_Nac = '{6}',Cliente_Codigo_Postal = {7}, Cliente_Habilitado = {8}" +
                      "where Cliente_Id = {9}";

            sql = string.Format(sql, cliente.Cliente_Nombre, cliente.Cliente_Apellido, cliente.Cliente_Dni, cliente.Cliente_Telefono,
                                     cliente.Cliente_Direccion,
                                     string.IsNullOrEmpty(cliente.Cliente_Mail) ? null : "'" + cliente.Cliente_Mail + "'",
                                     cliente.Cliente_Fecha_Nac.ToString("yyyy-MM-dd"), cliente.Cliente_Codigo_Postal,
                                     cliente.Cliente_Habilitado ? "1" : "0",
                                     cliente.Cliente_Id);


            ConexionBaseDeDatos.Guardar(sql, CommandType.Text);

        }

        public static void Eliminar(int clienteId)
        {
            var sql = "update SUPERACIDOS.Cliente set cliente_habilitado = 0 where Cliente_Id = " + clienteId;
            ConexionBaseDeDatos.Guardar(sql, CommandType.Text);
        }

    }

}

